package com.example.bigevent.controller;

import com.auth0.jwt.interfaces.Claim;
import com.example.bigevent.pojo.Result;
import com.example.bigevent.pojo.User;
import com.example.bigevent.service.UserService;
import com.example.bigevent.utills.JwtUtil;
import com.example.bigevent.utills.Md5Util;
import com.example.bigevent.utills.ThreadLocalUtil;
import jakarta.validation.constraints.Pattern;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
/*
* 就会被 Spring 识别为一个处理 HTTP 请求并返回响应的控制器组件，
* 并且方法的返回值会自动被转换为合适的格式（如 JSON、XML 等）并直接写入 HTTP 响应体中，
* 而不需要像传统的 Spring @Controller那样还需要显式地通过视图解析器来处理返回结果。*/
@RequestMapping("/user")
/*意味着所有以/user开头的 HTTP 请求路径
将会被考虑与标注了相应注解的控制器方法进行匹配
那么这个类中的所有方法的请求映射路径就都是基于这个/user前缀来进一步定义的。*/
public class UserController {


    /*
     * 它的主要功能是让 Spring 容器自动识别并装配（注入）所需的依赖对象到目标对象中，
     * 从而简化对象之间的依赖关系管理，*/
    @Autowired
    private UserService userService;

    @Validated
    @PostMapping("/register")
    /*它表示当接收到一个 HTTP POST 请求且请求路径为register时，就会调用标注有该注解的控制器方法来处理这个请求。*/
    public Result register(/*@Pattern(regexp="^\\S{5,16}$")*/String username,/* @Pattern(regexp="^\\S{5,16}$")*/String password) {

            //查询用户
            User u = userService.findByUserName(username);
            if (u == null) {
                //没有被占用
                userService.register(username, password);
                return Result.success();
            } else {
                //占用
                return Result.error("用户名已占用");
            }
    }

    @PostMapping("/login")
    public Result<String> login(@Pattern(regexp="^\\S{5,16}$") String username,@Pattern(regexp="^\\S{5,16}$") String password)
    {
        //查询用户
        User loginUser=userService.findByUserName(username);
        //判断是否查询到
        if(loginUser==null)
        {
            return Result.error("用户名错误");
        }
        //查询到了
        //判断密码是否正确
        //loginUser对象中的password是密文
        if(Md5Util.getMD5String(password).equals(loginUser.getPassword()))
        {
            //登录成功
            Map<String,Object> claims=new HashMap<>();
            claims.put("id",loginUser.getId());
            claims.put("username",loginUser.getUsername());
            //登录成功以后，从登录用户中获得id，获得用户名字，通过JwtUtil来获得这样一个（用户）字段下的Token令牌
            String token=JwtUtil.genToken(claims);
            return Result.success("token");//将令牌传出
        }
        return Result.error("密码错误");


    }

    @GetMapping("/userInfo")
    //RequestHeader从请求头中获取令牌（请求头中有很多值）
    public Result<User> userInfo(@RequestHeader(name = "Authorization") String token)
    {
        //根据用户名查询用户
       /* Map<String ,Object> map=JwtUtil.parseToken(token);//从Jwt验证那边传进来的是返回的用户的数据
        String username=(String) map.get("username");//从数据集中获取用户姓名*/
        Map<String,Object> map=ThreadLocalUtil.get();
        String username=(String) map.get("username");
        User user=userService.findByUserName(username);//确认有这个用户并接收用户
        return Result.success(user);
    }

    @PutMapping("/update")
    public Result update(@RequestBody User user)
    //为了让其能够自动的把请求体里面的json数据给我们转化为数据对象@RequestBody
    {
        userService.update(user);
        return Result.success();
    }

}
